package JavaEE.NetWork6;
// HTTP报头(header)
// 行文本,每一行都是一个键值对,键和值之间使用:空格 来分割
// header中的键值对都是标准规定的(也允许用户自定义),这些header中就存在特定的含义
// 此时,我们通过Fiddler对gitee主页进行抓包
// 1.Host:gitee.com
//   (存在于请求中的header)描述了访问的服务器的IP(域名)和端口(可省略)
// 2.Content-Length:168581(描述了body的长度)
//   通过描述body的长度,解决"粘包问题"(出现在TCP中,而HTTP基于TCP)
//   当客户端向服务器发送多个请求(获取HTML,CSS,图片)时,也可能在TCP接收缓冲区出现粘包问题.
//   -----服务器如何区分,从哪里到哪里是一个完成的 HTTP 请求?-----
//   1)如果没有body,直接读到空行.就可以认为请求结束
//   2)如果有body,header中必然存在Content-Length,取出Content-Length的值
//     找到空行,空行后面就是body的开始,从开始位置,读Content-Length这么多字节即可.
// 3.Content-Type:text/html;charset=utf-8(描述了body的数据格式)
//   上面这段表示:(body是html结构的数据)(body是通过utf-8正文编码)
//  (请求/响应 中存在body才会有 Content-Length 和 Content-Type 这俩属性)
//  (传输中没有Content-Length或者Type,代表一个"非法的"请求,浏览器会根据body内容来"猜")
// 4.User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64)
//              AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0
//              Safari/537.36 Edg/136.0.0.0
//   其中:(Windows NT 10.0; Win64; x64)代表操作系统是Windows NT 10.0,是64位系统.
//      :(Chrome/136.0.0.0)代表浏览器版本.(AppleWebKit)代表浏览器内核的版本.
// 5.Referer:https://gitee.com/bo-bo-xue-programming
//   表示当前页面由(Referer页面)跳转而来的.(不是所有的请求都有)
//   (Referer 和 浏览器的"回退"功能无关,浏览器自身维护了一个类似"栈"记录访问的过程)
//   应用情景:"搜狗"接了一个广告页面,通过点击次数来计费收取,同时"百度"也接了这个广告页面.
//   当用户从这些搜索引擎点击广告跳转时,HTTP请求头会携带Referer字段(如Referer:https://www.baidu.com)
//   今天广告主收到1000次访问,就可以通过(Referer)来统计,通过"百度"和"搜狗"分别跳转了多少次来计费.
// 6.Cookie:user_locale=zh-CN; oschina_new_user=false; slide_id=10; visit-gitee--2025-03-21=1;
//   Cookie中的内容也是"键值对",(使用";"分割多个键值对),(使用"="分割键值和)
//   Cookie本质上是浏览器在本地存储数据的一种机制~
//   应用场景:(app/桌面的程序)与(网站)还是有所不同的,前者有很多数据在客户端中,后者所有的数据都来自于服务器.
//   而(通过浏览器从服务器获取到网站的数据)和(应用程序中的数据),肯定是应用程序更安全(应用商店有审核).
//   浏览器也会采取一些手段来把控安全,浏览器会限制一个网站的权限,如:(浏览器禁止网站访问你的硬盘,禁止网站调用电脑上的其他程序)
//   而当(希望用网站在电脑存储一些数据时),就需要Cookie起作用了.
//   Cookie中的内容,其实是服务器返回给浏览器的~浏览器就会把Cookie保存到本地(硬盘上)
//   为了安全,不允许网站随意访问硬盘,而是只能按照"键值对"方式存储简单数据.
//   (服务器响应header中可能包含Set-Cookie报头.每个Set-Cookie就对应一个cookie键值对)
//    1):用户登陆状态维护
//    场景:保持用户登录状态,避免重复输入账号密码.
//    实现方法:服务器下发"包含会话ID"的 Cookie.(返回session_id)
//    后续再访问同一个服务器的其他页面,请求都会带上(Cookie:session_id=?)(存在存活时间上限)
//    2):个性化偏好设置
//    场景:记住用户的主题、语言等偏好。
//   会话 和 cookie 其实是两个机制.(在这个场景中配合使用)
//   (会话在服务器端,存储用户的详细情况)(cookie在客户端/浏览器,保存用户的身份标识)
//
// --------------------
//
// HTTP状态码:HTTP响应的报头里首行部分,通过不同的状态码,表示不同的含义.
// 如:HTTP/1.1 200 OK
// (1开头的状态码):表示请求已被接收,继续处理.
// (2开头的状态码):表示请求已成功处理,例如200表示成功.
//  1)200 OK 表示访问成功(HTTP层面的成功,不代表业务层面的成功.)
// (3开头的状态码):示需要进一步操作以完成请求,例如301表示永久重定向.
//   重定向:访问一个旧的地址,重新定向到新的地址上.
//  1)301 Moved Permanently(永久移动)(浏览器会做缓存,下次访问旧的地址,浏览器直接访问新地址)
//  2)302 Move temporarily(暂时移动)(浏览器不缓存,有的重定向是临时的,过一段时间就不需要.)
// (4开头的状态码):表示请求有误,例如404表示未找到.(客户端操作问题,打开方式错误~)
//  1)404 Not Found(客户端要访问的资源不存在,URL中的"层次结构的路径"就是"资源")
//  2)403 Forbidden(访问被拒绝 "没有权限")
// (5开头的状态码):表示服务器在处理请求时发生错误,例如500表示内部服务器错误.(程序员的问题.)
//  1)500 Intemal Server(服务器抛出异常,挂了.)
//    gateway:网关,服务器机房的入口服务.
//  2)502 Bad Gateway(错误的网关)
//  3)504 Gateway Timeout(网关超时)
//   发生502/504,并不是说"网关"挂了,而是(网关后面连接的机器如果挂了/等待时间太久,返回5xx).
//
public class Demo1 {
}
